﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;

namespace ProjectA.Modules.Configuracion.Usuarios
{
    public class cConfiguracionUsuarios
    {
        public string Mode { get; set; }
        private List<cUsuario> ListUsuarios { get; set; }
        private List<cProyectos> ListProjects { get; set; }
        private List<cModulos> ListModulos { get; set; }
        private List<cModulosPorUsuario> ListModulePerUser { get; set; }
        wsGeneral.WsGeneral wsGeneral;

        public cConfiguracionUsuarios()
        {
            wsGeneral = new ProjectA.wsGeneral.WsGeneral();
            cUsuario cUsuarioInfo = new cUsuario();
            ListUsuarios = new List<cUsuario>();
            ListProjects = new List<cProyectos>();
        }

        public List<cUsuario> GetAllUserInfo(DataSet dsData)
        {
            ListUsuarios = new List<cUsuario>();
            if (dsData.Tables.Count > 0)
            {
                for (int a = 0; a < dsData.Tables[0].Rows.Count; a++)
                {
                    cUsuario cUsuarioInfo = new cUsuario();
                    cUsuarioInfo.UserID = Convert.ToInt32(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["ID"]]);
                    cUsuarioInfo.UserName = dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["UserName"]].ToString();
                    cUsuarioInfo.Password = dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["Password"]].ToString();
                    cUsuarioInfo.FirstName = dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["FirstName"]].ToString();
                    cUsuarioInfo.SecondName = dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["SecondName"]].ToString();
                    cUsuarioInfo.FirstLastName = dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["FirstLastName"]].ToString();
                    cUsuarioInfo.SecondLastName = dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["SecondLastName"]].ToString();
                    cUsuarioInfo.CreationDate = Convert.ToDateTime(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["CreationDate"]].ToString());
                    cUsuarioInfo.ModificationDate = Convert.ToDateTime(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["ModificationDate"]].ToString());
                    if (dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["State"]].ToString() == "0")
                        cUsuarioInfo.UserState = false;
                    else
                        cUsuarioInfo.UserState = true;
                    cUsuarioInfo.Role = dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["Role"]].ToString();
                    ListUsuarios.Add(cUsuarioInfo);
                }
            }
            return ListUsuarios;
        }

        public List<cProyectos> LoadAllProjectInfo()
        {
            ListProjects = new List<cProyectos>();
            string sErrMess = "";
            bool bResult = false;
            DataSet dsData = new DataSet();
            bResult = wsGeneral.GetCentroCostos(null, null, null, null, null, null, out dsData, out sErrMess);
            if (bResult)
            {
                if (dsData.Tables.Count > 0)
                {
                    for (int a = 0; a < dsData.Tables[0].Rows.Count; a++)
                    {
                        cProyectos cProjects = new cProyectos();
                        cProjects.ID = Convert.ToInt32(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["ID"]]);
                        cProjects.Nombre = dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["Nombre"]].ToString();
                        cProjects.Descripcion = dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["Descripcion"]].ToString();
                        cProjects.FechaInicio = Convert.ToDateTime(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["FechaInicio"]].ToString());
                        cProjects.FechaFinal = Convert.ToDateTime(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["FechaFinal"]].ToString());
                        cProjects.Estado = Convert.ToInt32(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["Estado"]]);
                        ListProjects.Add(cProjects);
                    }
                }
            }
            return ListProjects;
        }

        public List<cProyectos> LoadProjectsPerUser(int iUserID)
        {
            string sErrMess = "";
            bool bResult = false;
            DataSet dsData = new DataSet();
            ListProjects = new List<cProyectos>();
            bResult = wsGeneral.GetProyectoPorUsuario(null, iUserID, null, out dsData, out sErrMess);
            if (bResult)
            {
                if (dsData.Tables.Count > 0)
                {
                    for (int i = 0; i < dsData.Tables[0].Rows.Count; i++)
                    {
                        cProyectos cProjects = new cProyectos();
                        cProjects.LoadProjectInfo(Convert.ToInt32(dsData.Tables[0].Rows[i]["ProyectoID"]));
                        ListProjects.Add(cProjects);
                    }
                }
            }
            return ListProjects;
        }

        public List<cModulos> LoadAllModules()
        {
            ListModulos = new List<cModulos>();
            string sErrMess = "";
            bool bResult = false;
            DataSet dsData = new DataSet();
            bResult = wsGeneral.GetModules(null, null, out dsData, out sErrMess);
            if (bResult)
            {
                if (dsData.Tables.Count > 0)
                {
                    for (int i = 0; i < dsData.Tables[0].Rows.Count; i++)
                    {
                        cModulos cModulos = new cModulos();
                        cModulos.ID = Convert.ToInt32(dsData.Tables[0].Rows[i][dsData.Tables[0].Columns["ID"]]);
                        cModulos.Description = dsData.Tables[0].Rows[i][dsData.Tables[0].Columns["Description"]].ToString();
                        ListModulos.Add(cModulos);
                    }
                }
            }
            return ListModulos;
        }

        public List<cModulosPorUsuario> LoadModulesPerUser(int iUserID)
        {
            ListModulePerUser = new List<cModulosPorUsuario>();
            string sErrMess = "";
            bool bResult = false;
            DataSet dsData = new DataSet();
            bResult = wsGeneral.GetModulePerUser(null, iUserID, null, null, out dsData, out sErrMess);
            if (bResult)
            {
                if (dsData.Tables.Count > 0)
                {
                    for (int i = 0; i < dsData.Tables[0].Rows.Count; i++)
                    {
                        cModulosPorUsuario cModulosPorUsuario = new cModulosPorUsuario();
                        cModulosPorUsuario.ID = Convert.ToInt32(dsData.Tables[0].Rows[i][dsData.Tables[0].Columns["ID"]]);
                        cModulosPorUsuario.ModuleID = Convert.ToInt32(dsData.Tables[0].Rows[i][dsData.Tables[0].Columns["ModuleID"]]);
                        cModulosPorUsuario.ProjectID = Convert.ToInt32(dsData.Tables[0].Rows[i][dsData.Tables[0].Columns["ProjectID"]]);
                        cModulosPorUsuario.UserID = Convert.ToInt32(dsData.Tables[0].Rows[i][dsData.Tables[0].Columns["UserID"]]);
                        ListModulePerUser.Add(cModulosPorUsuario);
                    }
                }
            }
            return ListModulePerUser;
        }

        public void SaveUserInfo(cUsuario UsuarioInfo)
        {
            try
            {
                string sErrMess = "";
                int iID = 0;
                if (Mode == "M")
                {
                    wsGeneral.ModifyMemberShip(UsuarioInfo.UserID, UsuarioInfo.FirstName, UsuarioInfo.SecondName, UsuarioInfo.FirstLastName, UsuarioInfo.SecondLastName, UsuarioInfo.Password, UsuarioInfo.UserName, UsuarioInfo.CreationDate, UsuarioInfo.UserState, UsuarioInfo.Role, out sErrMess);
                    if (sErrMess == "")
                    {
                        MessageBox.Show("Modificación Exitosa!");
                    }
                    else
                    {
                        MessageBox.Show(sErrMess);
                    }
                }
                else if (Mode == "A")
                {
                    wsGeneral.AddMembership(UsuarioInfo.FirstName, UsuarioInfo.SecondName, UsuarioInfo.FirstLastName, UsuarioInfo.SecondLastName, UsuarioInfo.Password, UsuarioInfo.UserName, UsuarioInfo.CreationDate, UsuarioInfo.UserState, UsuarioInfo.Role, out iID, out sErrMess);
                    if (sErrMess == "")
                    {
                        MessageBox.Show("Ingreso Exitoso!");
                    }
                    else
                    {
                        MessageBox.Show(sErrMess);
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("No se pudo realizar la modificación!");
            }
        }

        public void SaveModInDB(List<cModulosPorUsuario> lModulosPorUsuario, int iUserID, int iProjectID)
        {
            string sErrMess = "";
            bool bResult = false;
            DataSet dsData = new DataSet();
            List<int> lModAdd = new List<int>();
            List<cModulosPorUsuario> lModDel = new List<cModulosPorUsuario>();

            bResult = wsGeneral.GetModulePerUser(null, iUserID, iProjectID, null, out dsData, out sErrMess);
            if (bResult)
            {
                if (dsData.Tables[0].Rows.Count == 0)
                {
                    for (int h = 0; h < lModulosPorUsuario.Count; h++)
                    {
                        int iInserted = 0;
                        if (lModulosPorUsuario[h].ProjectID == iProjectID && lModulosPorUsuario[h].UserID == iUserID && lModulosPorUsuario[h].ID == 0)
                        {
                            bResult = wsGeneral.AddModulePerUser(lModulosPorUsuario[h].UserID, lModulosPorUsuario[h].ProjectID, lModulosPorUsuario[h].ModuleID, out iInserted, out sErrMess);
                            lModulosPorUsuario[h].ID = iInserted;
                        }
                    }
                }
                else
                {
                    for (int a = 0; a < dsData.Tables[0].Rows.Count; a++)
                    {
                        for (int b = 0; b < lModulosPorUsuario.Count; b++)
                        {
                            if (lModulosPorUsuario[b].ID == Convert.ToInt32(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["ID"]])
                                || lModulosPorUsuario[b].UserID == Convert.ToInt32(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["UserID"]])
                                && lModulosPorUsuario[b].ProjectID == Convert.ToInt32(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["ProjectID"]])
                                && lModulosPorUsuario[b].ModuleID == Convert.ToInt32(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["ModuleID"]]))
                            {
                                break;
                            }
                            else
                            {
                                wsGeneral.DeleteModulePerUser(Convert.ToInt32(dsData.Tables[0].Rows[a][dsData.Tables[0].Columns["ID"]]), out sErrMess);
                            }
                        }
                    }
                    for (int h = 0; h < lModulosPorUsuario.Count; h++)
                    {
                        int iInserted = 0;
                        if (lModulosPorUsuario[h].ProjectID == iProjectID && lModulosPorUsuario[h].UserID == iUserID && lModulosPorUsuario[h].ID == 0)
                        {
                            bResult = wsGeneral.AddModulePerUser(lModulosPorUsuario[h].UserID, lModulosPorUsuario[h].ProjectID, lModulosPorUsuario[h].ModuleID, out iInserted, out sErrMess);
                            lModulosPorUsuario[h].ID = iInserted;
                        }
                    }
                }
            }
        }

        public string LoginUser(string sUser, string sPassword, out cUsuario UserInfo)
        {
            UserInfo = new cUsuario();
            DataSet dsUser = new DataSet();
            string sErr = "";
            if ((sUser == "") && (sPassword == ""))
            {
                return "Por favor digite el usuario y la contraseña";
            }
            else
            {
                if (sUser != "")
                {
                    if (sPassword != "")
                    {
                        if (wsGeneral.GetMemberShip(null, null, null, null, null, sPassword, sUser, null, null, null, null, out dsUser, out sErr))
                        {
                            if (dsUser.Tables[0].Rows.Count == 1)
                            {
                                UserInfo.LoadUserInfo(dsUser);
                                return "";
                            }
                            else
                            {
                                return "El usuario o la contraseña son incorrectos!";
                            }
                        }
                    }
                    else
                    {
                        return "Ingrese la contraseña";
                    }
                }
                else
                {
                    return "Ingrese un nombre de usuario";
                }
            }
            return "Ingrese un nombre de usuario";
        }

        public bool DeleteUser(int iUserSelected)
        {
            try
            {
                string sErr = "";
                bool bResult = false;
                DataSet dsData = new DataSet();
                bResult = wsGeneral.GetModulePerUser(null, iUserSelected, null, null, out dsData, out sErr);
                if (dsData.Tables.Count > 0)
                {
                    for (int i = 0; i < dsData.Tables[0].Rows.Count; i++)
                    {
                        wsGeneral.DeleteModulePerUser((int)dsData.Tables[0].Rows[i][0], out sErr);
                    }
                }
                bResult = wsGeneral.DeleteMemberShip(iUserSelected, out sErr);
                return bResult;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public List<cProyectoXUser> InfoProyectosSelec(int iUserSelected, List<cProyectos> lAllProyectos)
        {

            //DataTable dtData = new DataTable();
            List<cProyectoXUser> lProyectoUser = new List<cProyectoXUser>();
            DataSet dsData = new DataSet();
            bool bResult = false;
            string sErr = "";

            bResult = wsGeneral.GetProyectoPorUsuario(null, iUserSelected, null, out dsData, out sErr);
            if (bResult)
            {
                for (int i = 0; i < dsData.Tables[0].Rows.Count; i++)
                {
                    cProyectoXUser oProjectUs = new cProyectoXUser();
                    oProjectUs.ID = Convert.ToInt32(dsData.Tables[0].Rows[i][0]);
                    oProjectUs.ProyectoID = Convert.ToInt32(dsData.Tables[0].Rows[i][2]);
                    lProyectoUser.Add(oProjectUs);
                }
                for (int i = 0; i < lAllProyectos.Count; i++)
                {
                    for (int j = 0; j < lProyectoUser.Count; j++)
                    {
                        if (lAllProyectos[i].ID == lProyectoUser[j].ProyectoID)
                        {
                            lProyectoUser[j].Index = i;
                            lProyectoUser[j].Estado = true;
                            break;
                        }
                    }
                }
            }
            return lProyectoUser;
        }

        public void GuardarProyectos(List<cProyectoXUser> lProyXUser, int iUserSelected)
        {
            string sErr = "";
            int iRegistroID = 0;
            bool bResult = false;
            for (int a = 0; a < lProyXUser.Count; a++)
            {
                if (lProyXUser[a].Estado == false && lProyXUser[a].ID != 0)
                {
                    DataSet ds = new DataSet();
                    string serr = "";
                    wsGeneral.GetModulePerUser(null, iUserSelected, lProyXUser[a].ProyectoID, null, out ds, out serr);
                    for (int c = 0; c < ds.Tables[0].Rows.Count; c++)
                        wsGeneral.DeleteModulePerUser(Convert.ToInt32(ds.Tables[0].Rows[c][0]), out sErr); ;
                    bResult = wsGeneral.DeleteProyectoPorUsuario(lProyXUser[a].ID, out sErr);
                    lProyXUser.Remove(lProyXUser[a]);
                    a--;
                }
                else if (lProyXUser[a].Estado == true && lProyXUser[a].ID == 0)
                {
                    int iVal = 0;
                    string serr = "";
                    wsGeneral.AddModulePerUser(iUserSelected, lProyXUser[a].ProyectoID, 2, out iVal, out serr);
                    bResult = wsGeneral.AddProyectoPorUsuario(iUserSelected, lProyXUser[a].ProyectoID, out iRegistroID, out sErr);
                    lProyXUser[a].ID = iRegistroID;
                }
            }
        }

        public List<cProyectoXUser> GetProyectosPorUsuario(int iUserID)
        {
            string sErrMes = "";
            DataSet dsData = new DataSet();
            List<cProyectoXUser> LProjects = new List<cProyectoXUser>();
            bool bResultado = wsGeneral.GetProyectoPorUsuario(null, iUserID, null, out dsData, out sErrMes);
            if (bResultado)
            {
                for (int i = 0; i < dsData.Tables[0].Rows.Count; i++)
                {
                    cProyectoXUser cProy = new cProyectoXUser();
                    DataSet ds = new DataSet();
                    cProy.ID = Convert.ToInt32(dsData.Tables[0].Rows[i][0]);
                    cProy.UsuarioID = Convert.ToInt32(dsData.Tables[0].Rows[i][1]);
                    cProy.ProyectoID = Convert.ToInt32(dsData.Tables[0].Rows[i][2]);
                    cProy.Estado = true;
                    wsGeneral.GetCentroCostos(cProy.ProyectoID, null, null, null, null, null, out ds, out sErrMes);
                    cProy.NombreProyecto = ds.Tables[0].Rows[0][ds.Tables[0].Columns["Nombre"]].ToString();
                    LProjects.Add(cProy);
                }
            }
            return LProjects;
        }
    }
}
